perm filename BOWLS.SAI[ALS,ALS] blob sn#261612 filedate 1977-02-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "BOWLS"
C00007 00003	MKROOM INSERT FULL DELETE ADD CORRECT NICK REPORT UPDATE GAME TEAMS NLIST GLIST LIKELY
C00024 00004	$ MAIN PROGRAM STARTS HERE
C00026 ENDMK
C⊗;
BEGIN "BOWLS"
DEFINE ⊂="BEGIN",⊃="END",$="COMMENT";
DEFINE SIZE="24",BSIZE="1024";
DEFINE \=" "; $ DEFINE \="SAFE";	$ Simple way to change to SAFE;

INTEGER ARRAY BUF,BUF2[0:1023],NDATA,RDATA[0:32],DATA[0:32];
INTEGER H,I,J,K,L,M,MM,N,P,Q,QQ,LENX,LENB,SIDEOF,BRCHR,CHAN1,CHAN2,EOF,SIDE,TSIZE,DELTA2;
SHORT REAL SCORE,RATING,DELTA;
STRING READ1,READ2,READ3,READ4,READ5,READX,READA,READW,READB,READN,READP,READC,READD,READY;
BOOLEAN ER;
LABEL MAIN1,MAIN2;

PROCEDURE HELP;
⊂	OUTSTR('11&"The Bowling on the Green Report"&'15&'12);
	OUTSTR   ("
Services  are:     	0. Exit.	1. Add game.	2. Add name.
	3. Corection.	4. Ratings.	5. List names.	6. List games.
	7. Suggestions.	8. Help me.	9. Delete name from list.

After  you have  typed a  number  to designate  the  type of  service
required, you will be asked a series of questions.  A carriage return
should terminate your answer.  A carriage return only  will terminate
most queries and go on to the next item, the exception being when you
are asked to verify a proposed entry. In thes case your answer should
be a Y or a N followed by a carriage return. 
");
⊃	;

PROCEDURE GET;			$ Get nickname and convert to caps.;
⊂	LABEL GET1;
GET1:	OUTSTR ('11&"Nickname = ");  READX←INCHWL;
	LENX←LENGTH(READX); IF LENX>6 THEN  LENX←6;
	J←CVSIX(READX);	READX←CVXSTR(J)[1 FOR LENX];
⊃	;

PROCEDURE STRIP;		$ Strip trailing spaces;
⊂	FOR Q←6 STEP -1 UNTIL 1 DO IF READB[Q FOR 1]≠" " THEN DONE;
	READB←READB[1 FOR Q]; QQ←QQ+Q;
⊃	;

PROCEDURE ASK;			$ Ask for confirmation showing full name;
⊂	LABEL ASK1;
ASK1:	OUTSTR ('11&"Do you mean "&CVXSTR(BUF[I]));
	OUTSTR("  i.e. ");
	FOR K←2 STEP 1 UNTIL 5 DO OUTSTR(CVSTR(BUF[I+K])); OUTSTR("?"&'11);
	READY←(INCHWL)[1 for 1];
	IF EQU(READY,"Y")∨EQU(READY,"y") THEN J←I ELSE 
		⊂ J←I+SIZE; OUTSTR ("Ambiguous!   "); ⊃ ;
⊃	;

PROCEDURE FIND;			$ Find nickname in list;
				$ J<I not found, J=I found, J>I ambiguous.;
⊂	
	LABEL FIND1,FIND2,FIND3,FIND4;

	FOR I←0 STEP SIZE UNTIL 1008 DO
 ⊂	"ILOOP"
FIND1:	IF BUF[I]=0 THEN ⊂ J←I-SIZE;  DONE; ⊃ ELSE
	READB←CVXSTR(BUF[I]); 	READ1←READX;
	STRIP;
	FOR K←1 STEP 1 UNTIL 6 DO
	  ⊂ L←LOP(READ1);  M←LOP(READB); IF (L≠M)∨(L=0)∨(M=0) THEN DONE; ⊃ ;
FIND2:	IF L=M THEN ⊂ J←I; DONE; ⊃ ;
FIND3:	IF M=0 THEN ⊂ ASK; DONE; ⊃ ;
	IF L=0 THEN
  ⊂	READ1←READX; READB←CVXSTR(BUF[I+SIZE]);
	STRIP;
	FOR N←1 STEP 1 UNTIL K DO
	  ⊂ L←LOP(READ1);  M←LOP(READB); IF (L≠M)∨(L=0)∨(M=0) THEN DONE; ⊃ ;
	IF (L≠M)∧(L≠0) THEN ⊂ J←I; DONE "ILOOP"; ⊃
	ELSE ⊂ J←I+SIZE; DONE "ILOOP"; ⊃ ;
  ⊃	;
FIND4:	IF  L<M        THEN ⊂ J←I-SIZE; DONE; ⊃ ;
 ⊃	;
⊃	;
COMMENT MKROOM INSERT FULL DELETE ADD CORRECT NICK REPORT UPDATE GAME TEAMS NLIST GLIST LIKELY;
PROCEDURE MKROOM;
⊂
LABEL MKRO1;
MKRO1:	IF BUF[I]≠0 THEN
 ⊂	FOR K←I STEP SIZE UNTIL 1008 DO IF BUF[K]=0 THEN DONE;
	IF K≥1008 THEN OUTSTR("Too many players! ") ELSE
  ⊂	FOR K←K-1 STEP -1 UNTIL I DO BUF[K+SIZE]←BUF[K];
	FOR K←I+SIZE-1 STEP -1 UNTIL I DO BUF[K]←0;
  ⊃	;
 ⊃	;
⊃	;

PROCEDURE INSERT;		$ To add new name to list;
⊂
LABEL INSER1;
INSER1:	BUF[I]←CVSIX(READX);
⊃	;

PROCEDURE FULL;
⊂	OUTSTR('11&"Type full name for record ");	READ3←INCHWL;	J←1;
	READ3←READ3&"            ";		$ Pad it out by 12 blanks;
	FOR K←2 STEP 1 UNTIL 5 DO ⊂ BUF[I+K]←CVASC(READ3[J FOR 5]); J←J+5; ⊃ ;
	BUF[I+6]←0;  BUF[I+7]←10000;
⊃	;

	
PROCEDURE DELETE;		$ Delete name from list;
⊂	GET;
	FIND;
	IF I≠J THEN  OUTSTR("Not found"&'15&'12) ELSE
 ⊂	OUTSTR("Do you really want to delete "&CVXSTR(BUF[I]));
	OUTSTR('11);
	FOR J←4 STEP 1 UNTIL 7 DO OUTSTR(CVSTR(BUF[I+J]));
	OUTSTR("?  ");
	READY←(INCHWL)[1 for 1];
	IF EQU(READY,"Y")∨EQU(READY,"y") THEN
     	FOR J←I STEP 1 UNTIL 999 DO
	BUF[J]←BUF[J+SIZE];
 ⊃	;
⊃	;


PROCEDURE ADD;
⊂	"ADD"			$ Returns index in I for location of nickname;
	WHILE TRUE DO
 ⊂	"TLOOP"
	GET;
	IF LENX=0 THEN DONE "TLOOP";
	FIND;
	IF I>J THEN ⊂ MKROOM; INSERT; FULL; ⊃ ;
	IF I=J THEN OUTSTR ("This nickname has already been used"&'15&'12);
 ⊃	"TLOOP";
⊃	"ADD";

PROCEDURE CORRECT;
⊂	"CORRECT"
	WHILE TRUE DO
 ⊂	"TLOOP"
	OUTSTR("Type old ");
	GET;
	IF LENX=0 THEN DONE "TLOOP";
	FIND;
	IF J≠I THEN ⊂ OUTSTR("Ambiguous, try again."&'15&'12); CONTINUE; ⊃  ELSE
  ⊂	OUTSTR (" for ");
	FOR K←2 STEP 1 UNTIL 5 DO OUTSTR(CVSTR(BUF[I+K]));
	OUTSTR ('15&'12&"CR or corrected nickname ");
	GET;
	IF LENX≠0 THEN INSERT;
	OUTSTR("CR or correct full name ");

	READ3←INCHWL;
	IF ¬EQU(READ3,"") THEN
   ⊂	READ3←READ3&"            ";		$ Pad it out by 12 blanks;
	FOR K←2 STEP 1 UNTIL 5 DO ⊂ BUF[I+K]←CVASC(READ3[J FOR 5]); J←J+5; ⊃ ;
   ⊃	;
	OUTSTR("Has played "&CVS(BUF[I+6])); OUTSTR(" games. CR or correct ");
	READ2←INCHWL; IF LENGTH(READ2)≠0 THEN BUF[I+6]←CVD(READ2);
	RATING←BUF[I+7]; RATING←RATING/100-100;
	OUTSTR("With a rating of "&CVF(RATING)&" CR or correct ");
	READ4←INCHWL; IF (LENGTH(READ4))>0 THEN

   ⊂	READX←""; READP←"."; READC←",";
	FOR K←1 STEP 1 UNTIL 3 DO
    ⊂	READ5←LOP(READ4); IF EQU(READ5,READP)∨EQU(READ5,READC) THEN DONE;
	READX←READX&READ5;
    ⊃	;
	IF EQU(READ5,READC) THEN READX←READX&"00" ELSE
    ⊂	READX←READX&READ5;
	READ4←LOP(READ3);
	IF EQU(READ4,READC) THEN READ4←"0";
	READX←READX&READ4;
    ⊃	;
	BUF[I+7]←CVD(READX);
   ⊃	;
  ⊃	;
 ⊃	"TLOOP";
⊃	"CORRECT";

PROCEDURE NICK;
⊂	READ1←READ2←READ3←"";
	IF I≥SIZE THEN FOR J←2 STEP 1 UNTIL 5 DO READ1←READ1&CVSTR(BUF[I-SIZE+J]);
	FOR J←2 STEP 1 UNTIL 5 DO READ2←READ2&CVSTR(BUF[I+J]);
	IF ¬ EQU(BUF[I+SIZE+2],"") THEN
	FOR J←2 STEP 1 UNTIL 5 DO READ3←READ3&CVSTR(BUF[I+SIZE+J]);
	FOR K←1 STEP 1 UNTIL 20 DO
 ⊂	L←LOP(READ1); M←LOP(READ2); N←LOP(READ3);
 ⊃	;
⊃	;

PROCEDURE REPORT;
⊂	"REPORT"
	LABEL REP1,REP2,REP3,REP4;
	I←J←0; NDATA[J]←I; RDATA[J]←BUF[I+7];
	OUTSTR('15&'12&
"Rating  Nickn.  Played on  With         Against           With earlier"&'15&'12);
REP1:	FOR I←SIZE STEP SIZE UNTIL 1008 DO
 ⊂	IF BUF[I]=0 THEN DONE; L←I%SIZE;
	NDATA[L]←I;  RDATA[L]←BUF[I+7];
REP2:	FOR J←L STEP -1 UNTIL 1 DO
  ⊂	IF RDATA[J]≤RDATA[J-1] THEN DONE;
REP3:	K←NDATA[J]; NDATA[J]←NDATA[J-1]; NDATA[J-1]←K;
	K←RDATA[J]; RDATA[J]←RDATA[J-1]; RDATA[J-1]←K;
  ⊃	;
 ⊃	;
REP4:	FOR K←0 STEP 1 UNTIL L DO
 ⊂	I←NDATA[K]; IF BUF[I]=0 THEN DONE;
	RATING←BUF[I+7]; RATING←(RATING/100)-100;
	OUTSTR('15&'12&CVF(RATING));
	OUTSTR('11&CVXSTR(BUF[I]));
	OUTSTR('11);
	OUTSTR(CVXSTR(BUF[I+18]));
	OUTSTR('11);  QQ←0;
	FOR J←8 STEP 1 UNTIL 11 DO
  ⊂	READB←CVXSTR(BUF[I+J]); 
	STRIP;
	OUTSTR(READB[1 FOR Q]);
	IF BUF[I+J+1]=0 THEN DONE; OUTSTR(","); QQ←QQ+1;
  ⊃	;
	FOR Q←QQ STEP 1 UNTIL 11 DO OUTSTR(" "); OUTSTR(" "); QQ←0;
	FOR J←12 STEP 1 UNTIL 17 DO
  ⊂	READB←CVXSTR(BUF[I+J]); 
	STRIP;
	OUTSTR(READB[1 FOR Q]);
	IF BUF[I+J+1]=0 THEN DONE; OUTSTR(","); QQ←QQ+1;
  ⊃	;
	FOR Q←QQ STEP 1 UNTIL 17 DO OUTSTR(" "); OUTSTR(" ");
	FOR J←20 STEP 1 UNTIL 23 DO
  ⊂	READB←CVXSTR(BUF[I+J]); 
	STRIP;
	OUTSTR(READB[1 FOR Q]);
	IF BUF[I+J+1]=0 THEN DONE; OUTSTR(",");
  ⊃	;
 ⊃	;
	OUTSTR('15&'12&'12&'12);
⊃	"REPORT";

PROCEDURE UPDATE;
⊂
	WHILE TRUE DO
 ⊂	GET;
	FIND;
	IF I>J THEN 
 ⊂	OUTSTR('11&"Is this a new name to add? ");
	READY←(INCHWL)[1 for 1];
	IF EQU(READY,"Y")∨EQU(READY,"y") THEN
	   ⊂ MKROOM; INSERT; FULL; J←I;  ⊃ ;
 ⊃	;
	IF I=J THEN
 ⊂	K←BUF[I+6]; L←BUF[I+7]; RATING←L; RATING←RATING/100-100;
	OUTSTR (CVSTR(BUF[I+2])&CVSTR(BUF[I+3])&CVSTR(BUF[I+4])&CVSTR(BUF[I+5]));
	SETFORMAT(1,0);
	OUTSTR ("  Game "&CVS(K+1));
	SETFORMAT(3,2);
	OUTSTR("  Rating was "&CVF(RATING));
	RATING←((RATING*3)+DELTA)/4;
	OUTSTR (" changed to "&CVF(RATING)&'15&'12);
	RATING←(RATING+100)*100; L←RATING;
	OUTSTR("Is this OK?"&'11);
	READY←(INCHWL)[1 FOR 1];
	IF EQU(READY,"Y")∨EQU(READY,"y") THEN
  ⊂	BUF[I+6]←BUF[I+6]+1; BUF[I+7]←L;
	DATA[P]←BUF[I]; P←P+1;
	DONE;
  ⊃	ELSE OUTSTR ("Sorry, try again ");
 ⊃	;
 ⊃	;
⊃	;


PROCEDURE GAME;
⊂	"GAME"
	INTEGER HH,JJ,JJJ;
	LABEL GA0,GA1,GA2,GA3,GA4,GA5,GA6;
	SETFORMAT(5,3);
	OUTSTR('15&'12&'11&"Type date of game = ");
	READD←INCHWL;
	WHILE TRUE DO
 ⊂	OUTSTR('11&"Type score difference = ");
	IF LENGTH((READ1←INCHWL))=0 THEN DONE;
	DELTA2←DELTA←CVD(READ1);
	OUTSTR('11&"Type number on each side = ");
	SIDE←CVD(INCHWL);
	DELTA←DELTA/SIDE;
	OUTSTR('11&'11&"List winners by nickname"&'15&'12);
	P←0;
GA0:	FOR JJJ←1 STEP 1 UNTIL SIDE DO UPDATE;
	DELTA←0-DELTA;
	OUTSTR('15&'12&'11&'11&"Now list losers by nickname"&'15&'12);
	FOR JJJ←1 STEP 1 UNTIL SIDE DO UPDATE;

$ Add to list of teams, testing cell containing SIDE for empty slot;
	FOR J←2 STEP 12 UNTIL 1010 DO IF BUF2[J]=0 THEN DONE;
	IF J>1010 THEN
  ⊂	FOR J←0 STEP 1 UNTIL 1007 DO BUF2[J]←BUF2[J+12];
	FOR J←1008 STEP 1 UNTIL 1023 DO BUF2[J]←0;
	J←1008;
  ⊃	ELSE J←J-2;
	BUF2[J]←CVSIX(READD); BUF2[J+2]←SIDE; BUF2[J+3]←DELTA2;
	FOR K←0 STEP 1 UNTIL 7 DO BUF2[J+K+4]←DATA[K];
	
$ Now make lists of team-mates and opponents;
	HH←(SIDE*2)-1; JJ←SIDE-1;
GA1:	FOR H←0 STEP 1 UNTIL HH DO
  ⊂	READB←CVXSTR(DATA[H]);
	STRIP;
	READX←READB;
	FIND;
GA2:	FOR L←8 STEP 1 UNTIL 11 DO BUF[I+L+12]←BUF[I+L];
	FOR L←8 STEP 1 UNTIL 17 DO BUF[I+L]←0;
 	L←8; M←12;
GA3:	FOR J←0 STEP 1 UNTIL HH DO
   ⊂	IF ((H≤JJ)∧(J≤JJ))∨((H>JJ)∧(J>JJ)) THEN
    ⊂	IF J≠H THEN ⊂ BUF[I+L]←DATA[J]; L←L+1; ⊃ ;
    ⊃	ELSE
    ⊂	BUF[I+M]←DATA[J]; M←M+1;
    ⊃	;
   ⊃	;
GA4:	WHILE L≤11 DO ⊂ BUF[I+L]←0; L←L+1; ⊃ ;
	WHILE M≤17 DO ⊂ BUF[I+M]←0; M←M+1; ⊃ ;
	BUF[I+18]←CVSIX(READD);
  ⊃	;
	OUTSTR('11&"Game has been recorded.  Next game please."&'15&'12&'12);
 ⊃	;
⊃	"GAME";

PROCEDURE TEAMS;
⊂	INTEGER JJ;
	OUTSTR('15&'12&"Date    Delta   Winning team            Losing team"&'15&'12);
	FOR J←2 STEP 12 UNTIL 1008 DO IF BUF2[J]=0 THEN DONE;
	IF J<14 THEN J←14;
	FOR J←J-14 STEP -12 UNTIL 0 DO
 ⊂	OUTSTR('15&'12);
	OUTSTR(CVXSTR(BUF2[J]));
	SIDE←BUF2[J+2]; JJ←SIDE-1;
 	OUTSTR('11&CVS(BUF2[J+3]));
	OUTSTR('11);
	QQ←0;
	FOR K←0 STEP 1 UNTIL JJ DO 
  ⊂	READB←CVXSTR(BUF2[J+4+K]);
	STRIP; OUTSTR(READB);
	IF BUF2[J+5+K]=0 THEN DONE; OUTSTR(","); QQ←QQ+1;
  ⊃	;
	FOR Q←QQ STEP 1 UNTIL 20 DO OUTSTR(" "); OUTSTR(" ");
	FOR K←SIDE STEP 1 UNTIL 7 DO
  ⊂	READB←CVXSTR(BUF2[J+4+K]);
	STRIP; OUTSTR(READB);
	IF BUF2[J+5+K]=0 THEN DONE; OUTSTR(","); QQ←QQ+1;
  ⊃	;
 ⊃	;
	OUTSTR('15&'12&'12);
⊃	;

PROCEDURE NLIST;
⊂	"NLIST"
	OUTSTR("Nickn.  Games   Rating  Name"&'15&'12);
	FOR I←0 STEP SIZE UNTIL 1000 DO
 ⊂	IF BUF[I]=0 THEN DONE;
	OUTSTR('15&'12);
	RATING←BUF[I+7]; RATING←RATING/100-100;
	OUTSTR(CVXSTR(BUF[I]));
	SETFORMAT(3,0);
	OUTSTR('11&CVS(BUF[I+6]));
	SETFORMAT(5,2);
	OUTSTR('11&CVF(RATING)); OUTSTR('11);
	FOR K←2 STEP 1 UNTIL 5 DO OUTSTR(CVSTR(BUF[I+K]));
 ⊃	;
	OUTSTR('15&'12&'12&'12);
⊃	"NLIST";

PROCEDURE GLIST;
⊂	"GLIST"

⊃	"GLIST";

PROCEDURE LIKELY;
⊂	INTEGER II,JJ,KK,LL;
	INTEGER ARRAY DATA2[0:64];
	LABEL LI1,LI2,LI3;
	OUTSTR('12&'12&'11&'11&"Bowling on the Green"&'15&'12&'12);
	OUTSTR("Name    Likely suggestions for people to play");
 	FOR I←0 STEP SIZE UNTIL BSIZE DO
 ⊂	"ILOOP"			$ Consider each person on the list;
	IF BUF[I]=0 THEN DONE;
	FOR II←0 STEP SIZE UNTIL BSIZE DO
  ⊂	"IILOOP"		$ Make up 2 lists of the other players;
	IF BUF[II]=0 THEN DONE;
	J←II%SIZE; IF I≠II THEN DATA[J]←DATA2[J]←BUF[II] ELSE DATA[J]←DATA2[J]←0;
  ⊃	"IILOOP";
LI1:	JJ←J;			$ JJ contains the total number of players;
	FOR J←2 STEP 12 UNTIL BSIZE DO IF BUF2[J]=0 THEN DONE;
				$ Now start with the most recent game;
	OUTSTR('15&'12);
	FOR J←J-12 STEP -12 UNTIL 2 DO 
  ⊂	"JLOOP"			$ Consider the games one at a time, backwards;
	SIDE←BUF2[J];
	IF SIDE=0 THEN CONTINUE;	$ There is an error somewhere;
$ Check winning sides;
	FOR K←1 STEP 1 UNTIL SIDE DO
   ⊂	"KWLOOP"
LI2:	IF BUF2[J+K+1]≠BUF[I] THEN CONTINUE ELSE
$ for team-mates;
    ⊂	FOR LL←1 STEP 1 UNTIL SIDE DO
     ⊂	IF BUF2[J+LL+1]=0 THEN DONE;
	FOR L←0 STEP 1 UNTIL JJ DO IF DATA[L]=BUF2[J+LL+1] THEN
	  ⊂ DATA[L]←0; DONE; ⊃ ;
     ⊃	;
$ and for opponents;
	FOR LL←SIDE+1 STEP 1 UNTIL SIDE*2 DO
     ⊂	IF BUF2[J+LL+1]=0 THEN DONE;
	FOR L←0 STEP 1 UNTIL JJ DO IF DATA2[L]=BUF2[J+LL+1] THEN
	  ⊂ DATA2[L]←0; DONE; ⊃ ;
     ⊃	;
    ⊃	;
   ⊃	"KWLOOP";
$ Check losing sides;
	FOR K←SIDE+1 STEP 1 UNTIL SIDE*2 DO
   ⊂	"KLLOOP"
LI3:	IF BUF2[J+K+1]≠BUF[I] THEN CONTINUE ELSE
$ for team-mates;
    ⊂	FOR LL←SIDE+1 STEP 1 UNTIL SIDE*2 DO
     ⊂	IF BUF2[J+LL+1]=0 THEN DONE;
	FOR L←0 STEP 1 UNTIL JJ DO IF DATA[L]=BUF2[J+LL+1] THEN
	  ⊂ DATA[L]←0; DONE;  ⊃
     ⊃	;
$ and for opponents;
	FOR LL←1 STEP 1 UNTIL SIDE DO
     ⊂	IF BUF2[J+LL+1]=0 THEN DONE;
	FOR L←0 STEP 1 UNTIL JJ DO IF DATA2[L]=BUF2[J+LL+1] THEN
	  ⊂ DATA2[L]←0; DONE;  ⊃
     ⊃	;
    ⊃	;
   ⊃	"KLLOOP";
  ⊃	"JLOOP";
	OUTSTR('15&'12&CVXSTR(BUF[I]));
	OUTSTR('15&'12&"With    ");
	KK←0;
	FOR L←0 STEP 1 UNTIL JJ DO
  ⊂	IF KK≥9 THEN ⊂ OUTSTR('15&'12&'11); KK←0; ⊃;
	IF DATA[L]≠0 THEN 
	  ⊂ OUTSTR(CVXSTR(DATA[L])); OUTSTR(" "); KK←KK+1; ⊃ ;
  ⊃	;
	OUTSTR('15&'12&"Against ");
	KK←0;
	FOR L←0 STEP 1 UNTIL JJ DO
  ⊂	IF KK≥9 THEN ⊂ OUTSTR('15&'12&'11); KK←0; ⊃;
	IF DATA2[L]≠0 THEN 
	  ⊂ OUTSTR(CVXSTR(DATA2[L])); OUTSTR(" "); KK←KK+1; ⊃ ;
  ⊃	;
 ⊃	"ILOOP";
	OUTSTR('15&'12&'12);
⊃	;
$ MAIN PROGRAM STARTS HERE;

CHAN1←1;	CHAN2←2;
CLOSE (CHAN1);	OPEN (CHAN1,"DSK",'10,2,0,0,0,EOF);
LOOKUP (CHAN1,"BOWLS.DAT[ALS,ALS]",ER);
IF ER THEN OUTSTR ("BOWLS.DAT does not exist."&'15&'12) ELSE
⊂ ARRYIN(CHAN1,BUF[0],BSIZE); ARRYIN(CHAN1,BUF2[0],BSIZE); ⊃;
CLOSE(CHAN1);

READP←"."; READC←'15;
$ Main program loop starts here;
	OUTSTR   ("
Services  are:     	0. Exit.	1. Add game.	2. Add name.
	3. Corection.	4. Ratings.	5. List names.	6. List games.
	7. Suggestions	8. Help me.	8. Delete name.
");
MAIN1:	WHILE TRUE DO
 ⊂	OUTSTR('15&'12&"Type number for service (8 for help) = ");
	SETFORMAT (5,2);
	I←CVD(INCHWL);
	IF (I>9)∨(I≤0) THEN DONE;
	CASE I OF ⊂ ;GAME;ADD;CORRECT;REPORT;NLIST;TEAMS;LIKELY;HELP;DELETE ⊃ ;
 ⊃ ;
MAIN2:	CLOSE (CHAN2);	OPEN (CHAN2,"DSK",'10,0,2,0,0,EOF);
	ENTER (CHAN2,"BOWLS.DAT[ALS,ALS]",ER);
	ARRYOUT (CHAN2,BUF[0],BSIZE);
	ARRYOUT (CHAN2,BUF2[0],BSIZE);	CLOSE(CHAN2); RELEASE(CHAN2);
⊃	"BOWLS";